package com.bjpowernode.app;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;

//核心思路【需要层次结构表达、递归、堆栈三个技巧】
//使用自定义节点类表达层次结构
//对每个节点分别一次创建目录
public class MyApp7 {
    //创建节点对象【主要的目的是为了记住层级结构的关系】
    //这里采用内部类是为了方便，仅此而已
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Node {
        //路径名称
        String name;
        //为了保持层级结构的关系，创建一个父类，类型还是当前节点类型
        Node parent;
    }

    //linkedList使用堆栈方案，进行路径的组装
    LinkedList<String> linkedList = new LinkedList<>();

    //完成每个节点的路径组装任务，需要三个步骤【参数是当前的节点】
    //1——自己本身的路径入栈
    //2——父亲路径入栈【使用递归，递归到顶层父亲后结束，并且入栈到LinkedList，因为打印出来的是倒着的】
    //3——打印出来完成的路径【使用出栈打印】
    public String doing(Node currentNode) {
        //1——自己入栈
        linkedList.push(currentNode.getName());
        //2——父亲递归入栈【需要封装方法来递归】
        nodeRead(currentNode);
        //3——循环出栈【需要封装方法来出栈】
        String result = createDir();
        return result;
    }


    //2——父亲路径入栈
    //递归节点
    private void nodeRead(Node node) {
        //获取树节点的父亲
        Node temp = node.getParent();
        if (temp != null) {
            //如果父亲不为空则入栈LinkedList
            //入栈
            linkedList.push(temp.getName());
            //继续递归当前父节点
            nodeRead(temp);
        }
    }

    //3——打印出来完成的路径
    //打印当前节点
    private String createDir() {
        StringBuffer path = new StringBuffer();
        //查看栈顶是否有数据，如果有数据，则出栈
        //全部出栈，因此需要循环
        while (linkedList.peek() != null) {
            //出栈
            String pop = linkedList.pop();
            path.append(pop);
            path.append("\\");
        }
        return path.toString();
    }


    public static void main(String[] args) {


        //创建每个单独的节点,并且表达层次关系
        Node nodeSrc = new Node("src", null);
        Node nodeMain = new Node("main", nodeSrc);
        Node nodeTest = new Node("test", nodeSrc);
        Node nodeJava = new Node("java", nodeMain);
        Node nodeResources = new Node("resources", nodeMain);
        Node nodeCom = new Node("com", nodeJava);
        Node nodeBjpowernode = new Node("bjpowernode", nodeCom);
        Node nodeBeans = new Node("beans", nodeBjpowernode);
        Node nodeMapper = new Node("mapper", nodeBjpowernode);
        Node nodeServices = new Node("services", nodeBjpowernode);
        Node nodeController = new Node("controller", nodeBjpowernode);


        //把节点放入到集合里面【方便管理，准备为每个节点都进行目录的创建】
        ArrayList<Node> nodes = new ArrayList<>();
        nodes.add(nodeSrc);
        nodes.add(nodeMain);
        nodes.add(nodeTest);
        nodes.add(nodeJava);
        nodes.add(nodeResources);
        nodes.add(nodeCom);
        nodes.add(nodeBjpowernode);
        nodes.add(nodeBeans);
        nodes.add(nodeMapper);
        nodes.add(nodeServices);
        nodes.add(nodeController);

        //开始执行每个节点的目录创建
        MyApp7 myApp7 = new MyApp7();
        //循环节点集合
        for (Node nodeTemp : nodes) {
            //调用doing方法组装好当前节点的路径
            String nodePath = myApp7.doing(nodeTemp);
            //每个节点路径再次追加盘符
            String path = "d:\\web1\\" + nodePath;
            //最后利用File对象的mkdirs()方法进行路径的创建【达到根据层级结构批量创建目录的目的】
            File file = new File(path);
            boolean mkdirs = file.mkdirs();
            if (mkdirs) {
                System.out.println(path + "----目录创建成功!!!");
            } else {
                System.out.println(path + "----目录创建失败***********************");
            }
        }
    }


}
